from rest_framework import serializers
from django_redis import get_redis_connection
from redis.exceptions import RedisError

import logging

logger = logging.getLogger('meiduo')


class RegisterSMSCodeSerializer(serializers.Serializer):

    text = serializers.CharField(label='验证码',max_length=4,min_length=4)
    image_code_id = serializers.UUIDField(label='uuid')


    #字段的类型校验
    #字段的选项校验
    #单个字段校验
    #多个字段校验
    def validate(self, attrs):

        #我们需要把redis中的验证码获取出来之后  进行校验

        #1.用户提交的验证码拿到
        text = attrs.get('text')
        image_code_id = attrs.get('image_code_id')
        #2.获取redis中的验证码
        #2.1连接
        redis_conn = get_redis_connection('code')
        #2.2获取
        redis_text = redis_conn.get('img_%s' %image_code_id)
        #2.3判断 redis_text 是否过期
        if redis_text is None:
            raise serializers.ValidationError('验证码已过期')
        #2.4主动删除已经获取到的 redis中的数据
        try:
            redis_conn.delete('img_%s'%image_code_id)
        except RedisError as e:
            logger.error(e)
        #2.5进行比对  redis获取的数据类型是bytes类型，，，需将字符串都转换为小写lower（）
        if redis_text.decode().lower() != text.lower():
            raise serializers.ValidationError('验证码不正确')
        return attrs
